const { spawn } = require('child_process');
const path = require('path');
const fs = require('fs');
const http = require('http');

console.log('正在启动文档扫描服务...');

// 检查server目录是否存在
const serverDir = path.join(__dirname, 'server');
if (!fs.existsSync(serverDir)) {
  console.error('错误: server目录不存在');
  process.exit(1);
}

// 检查node_modules是否已安装
const nodeModulesDir = path.join(serverDir, 'node_modules');
if (!fs.existsSync(nodeModulesDir)) {
  console.log('正在安装依赖...');
  
  // 执行npm install
  const npmInstall = spawn('npm', ['install'], { 
    cwd: serverDir,
    shell: true,
    stdio: 'inherit'
  });
  
  npmInstall.on('close', (code) => {
    if (code !== 0) {
      console.error(`错误: npm install 失败，退出码 ${code}`);
      process.exit(1);
    }
    
    startServer();
  });
} else {
  startServer();
}

function startServer() {
  console.log('正在启动服务器...');
  
  // 创建uploads目录（如果不存在）
  const uploadsDir = path.join(serverDir, 'public', 'uploads');
  if (!fs.existsSync(uploadsDir)) {
    fs.mkdirSync(uploadsDir, { recursive: true });
  }
  
  // 启动服务器，添加内存限制和垃圾回收选项
  const server = spawn('node', [
    '--max-old-space-size=512', // 限制内存使用为512MB
    '--expose-gc',              // 启用手动垃圾回收
    'app.js'
  ], { 
    cwd: serverDir,
    shell: true,
    stdio: 'inherit'
  });
  
  server.on('close', (code) => {
    if (code !== 0) {
      console.error(`服务器进程退出，退出码 ${code}`);
      process.exit(1);
    }
  });
  
  // 等待服务器启动
  waitForServer();
}

function waitForServer() {
  console.log('等待服务器启动...');
  
  // 尝试连接服务器
  const checkServer = () => {
    http.get('http://localhost:3001/api', (res) => {
      if (res.statusCode === 200) {
        console.log('服务器已成功启动！');
        console.log('');
        console.log('您可以通过以下方式访问服务：');
        console.log('- 测试页面: http://localhost:3001');
        console.log('- API接口: http://localhost:3001/api');
        console.log('');
        console.log('按Ctrl+C可以停止服务');
      } else {
        setTimeout(checkServer, 1000);
      }
    }).on('error', () => {
      setTimeout(checkServer, 1000);
    });
  };
  
  setTimeout(checkServer, 1000);
}